/**
 * 统一HTTP请求工具
 * 提供标准化的API请求功能
 */

(function() {
    // API基础配置
    const API_BASE_URL = window.location.origin;
    const TOKEN_KEY = 'hero_token';

    // Token管理
    const TokenManager = {
        get() {
            return localStorage.getItem(TOKEN_KEY);
        },

        set(token) {
            localStorage.setItem(TOKEN_KEY, token);
        },

        remove() {
            localStorage.removeItem(TOKEN_KEY);
        },

        has() {
            return !!this.get();
        }
    };

    // HTTP请求工具
    function request(config) {
        const url = API_BASE_URL + config.url;
        const options = {
            method: config.method || 'GET',
            headers: {
                'Content-Type': 'application/json',
                ...config.headers
            }
        };

        // 添加认证头
        const token = TokenManager.get();
        if (token && !config.skipAuth) {
            options.headers['Authorization'] = 'Bearer ' + token;
        }

        // 处理请求体
        if (config.data) {
            if (config.data instanceof FormData) {
                // FormData不需要JSON序列化，也不需要设置Content-Type
                options.body = config.data;
                delete options.headers['Content-Type'];
            } else {
                options.body = JSON.stringify(config.data);
            }
        }

        // 处理GET请求参数
        if (config.params && config.method === 'GET') {
            const searchParams = new URLSearchParams(config.params);
            const separator = config.url.includes('?') ? '&' : '?';
            const fullUrl = config.url + separator + searchParams.toString();
            return fetch(API_BASE_URL + fullUrl, options)
                .then(handleResponse);
        }

        return fetch(url, options)
            .then(handleResponse);
    }

    // 统一响应处理
    function handleResponse(response) {
        if (!response.ok) {
            throw new Error(`HTTP ${response.status}: ${response.statusText}`);
        }
        return response.json().then(data => {
            // 检查业务状态码
            const code = data.code || 200;

            if (code === 401) {
                // 登录状态过期
                TokenManager.remove();
                if (window.HeroLoginModal) {
                    window.HeroLoginModal.showExpiredModal();
                }
                throw new Error('登录状态已过期，请重新登录');
            } else if (code === 500) {
                throw new Error(data.msg || '服务器内部错误');
            } else if (code === 601) {
                throw new Error(data.msg || '请求参数错误');
            } else if (code !== 200) {
                throw new Error(data.msg || '请求失败');
            }

            return data;
        });
    }

    // 全局暴露
    window.HeroRequest = {
        // 通用请求方法
        request: request,
        
        // GET请求方法
        get(url, params = {}, config = {}) {
            return request({
                url: url,
                method: 'GET',
                params: params,
                ...config
            });
        },
        
        // POST请求方法
        post(url, data = {}, config = {}) {
            return request({
                url: url,
                method: 'POST',
                data: data,
                ...config
            });
        },
        
        // PUT请求方法
        put(url, data = {}, config = {}) {
            return request({
                url: url,
                method: 'PUT',
                data: data,
                ...config
            });
        },
        
        // DELETE请求方法
        delete(url, config = {}) {
            return request({
                url: url,
                method: 'DELETE',
                ...config
            });
        },
        
        // Token管理器
        TokenManager: TokenManager
    };

})();